/**
 * @file ke-url的全局设置选项，目前的主要是调试方面的设置
 * @module ke-url/options
 * @exports ke-url/options
 * @requires lodash
 */

import * as _ from 'lodash';

/**
 * 调试等级枚举
 * @namespace DebugLevel
 * @type {Object}
 * @typedef {number} DebugLevel
 * @memberOf module:ke-url/options
 * @property {number} DebugLevel.None - 不调试
 * @property {number} DebugLevel.Log - 普通调试等级
 * @property {number} DebugLevel.Trace - 跟踪调试等级
 * @property {number} DebugLevel.Error - 错误调试等级（包括异常）
 */
export enum DebugLevel {
	None = 0,
	Log,
	Trace,
	Error,
}

type DebugHandle = (level, ...msgs) => void;

/**
 * 默认的调试输出方法
 * @param {DebugLevel} level 调试输出的等级
 * @param {any[]} msgs 需要输出的信息或者变量
 */
function defaultDebug(level, ...msgs) {
	let method;
	switch (_.toInteger(level)) {
		case DebugLevel.Trace :
			method = console && console.debug ? console.debug : null;
			break;
		case DebugLevel.Error :
			method = console && console.error ? console.error : null;
			break;
		case DebugLevel.Log :
			method = console && console.log ? console.log : null;
			break;
	}
	if (typeof method === 'function')
		method(...msgs);
}

let globalDebugLevel = DebugLevel.None;

let globalDebugHandle = defaultDebug;

/**
 * 设置全局的调试等级和调试方法
 * @method setDebug
 * @memberOf module:ke-url/options
 * @param {number} debugLevel 全局的调试等级
 * @param {Function} handle 全局的调试方法
 */
export function setDebug(debugLevel: DebugLevel, handle?: DebugHandle) {
	globalDebugLevel = _.toInteger(debugLevel);
	if (globalDebugLevel > DebugLevel.None && handle)
		setDebugHandle(handle);
}

/**
 * 判断全局环境下是否启用了调试模式。
 *
 * @method isDebug
 * @memberOf module:ke-url/options
 * @param {DebugLevel} level 指定当前的全局调试状态是否为指定的调试等级。
 * @returns {boolean}
 */
export function isDebug(level?: DebugLevel): boolean {
	if (typeof level !== 'undefined' && level !== null) {
		return level === globalDebugLevel;
	}
	return globalDebugLevel > DebugLevel.None;
}

/**
 * 全局调用的调试输出方法。
 * @method debug
 * @memberOf module:ke-url/options
 * @param {DebugLevel} level 调试输出的等级。
 * @param {any[]} msgs 需要输出的内容或者变量。
 */
export function debug(level: DebugLevel, ...msgs) {
	if (globalDebugLevel >= level)
		globalDebugHandle(level, ...msgs);
}

/**
 * 设置全局的调试输出方法。
 * @method setDebugHandle
 * @memberOf module:ke-url/options
 * @param {Function} handle 需要替换的调试输出方法，需要注意该方法要自行处理变量的输出方法。
 */
export function setDebugHandle(handle: DebugHandle) {
	if (typeof handle === 'function')
		globalDebugHandle = handle;
}